"""
定义简单的类（只包括方法）

#定义只包含方法的类
格式：

class 类名:
    def 方法1(self,参数列表)：
        语句
    def 方法2(self,参数列表)：
        语句

方法的定义格式与函数基本一样
方法的第一个参数必须是self


当类定义完成后，需要使用类创建对象
#创建对象
格式:
对象变量 = 类名()

"""

# 实例
# # 创建类
# class cat:
#     def drink(self):
#         print("猫喝了水")
#     def eat(self,food):
#         print("猫吃了{}".format(food))
# # 创建类
# red_cat = cat()
# # 调用方法
# red_cat.eat("fish")
# red_cat.drink()


# 主程序中只负责让对象工作，不在意方法内部实现


# 引用
"""
当print一个对象变量中时
输出的是引用对象是哪一个类创建的，以及地址
"""
# # 创建类
# class cat:
#     def drink(self):
#         print("猫喝了水")
#     def eat(self,food):
#         print("猫吃了{}".format(food))
# # 创建类
# red_cat = cat()
# # 调用方法
# red_cat.eat("fish")
# red_cat.drink()
# print(red_cat)
# # <__main__.cat object at 0x00000166573E69D0>

"""
创建多个对象
"""

# # 创建类
# class cat:
#     def drink(self):
#         print("猫喝了水")
#     def eat(self,food):
#         print("猫吃了{}".format(food))
# # 创建类
# red_cat = cat()
# # 调用方法
# red_cat.eat("fish")
# red_cat.drink()
#
# # 创建另一个对象
# blue_cat = cat()
# blue_cat.eat("aaa")
# blue_cat.drink()
# print(red_cat)
# print(blue_cat)
# # 两只猫对象的内存地址不同
# blue_cat2 = blue_cat
# print(blue_cat2)
# # blue_cat2的内存地址与blue_cat相同

"""
在不修改类的情况下，给对象增加属性(不推荐使用,因为属性尽量要在类的内部)
对象.属性名称 = 属性
"""


# # 实例
# # 创建类
# class cat:
#     def drink(self):
#         print("猫喝了水")
#     def eat(self,food):
#         print("猫吃了{}".format(food))
# # 创建类
# red_cat = cat()
# # 调用方法
# red_cat.eat("fish")
# red_cat.drink()
#
#
# # 增加属性
# red_cat.name = "tom"
# print(red_cat.name)

"""
self 参数:
哪一个函数调用类中的方法，那么self就是哪一个对象的引用
"""
# class Cat:
#     def eat(self):
#         self.name = "aaa"
#         print("%s 吃鱼"%self.name)
#         print("{} 吃鱼".format(self.name))
#         print(self)
#
# red_cat = Cat()
# red_cat.name = "bbb"
# red_cat.eat()

"""
在类的内部增加属性

初始化方法
创建对象时会自动在内存中
1.为对象在内存中分配空间 
2.为对象的属性设置初始值 __init__

__init__:初始化方法，内置的，专门定义一个类中具有哪些属性的方法
"""

# 实例
# class Cat:
#     def __init__(self):
#         self.name = "aaa"
#     def eat(self):
#         print("{}吃鱼".format(self.name))
#
# blue_cat = Cat()
# blue_cat.eat()
# red_cat = Cat()
# red_cat.name = "bbb"
# red_cat.eat()
# 如果给属性重新赋值 则使用新值，否则使用__init__中的初始属性值

"""
改造初始化方法
在self后增加形参
在创建对象时传入参数
"""

# class cat:
#     def __init__(self,name):
#         self.name = name
#     def eat(self):
#         print(self.name+" eat bbb")
# red_cat = cat(name = "aaa")
# red_cat.eat()


"""
del内置方法
__del__ 如果希望对象被销毁前做一些事情，使用此方法，与__init__对应

生命周期
一个对象从调用类名()创建，生命周期开始
一个对象的__del__方法一旦被调用，生命周期结束
在对象的生命周期内部 可以访问对象属性，或者让对象调用方法

"""
#实例
# class cat:
#     def __init__(self,new_name):
#         self.name = new_name
#         print(self.name+"对象的生命周期开始")
#     def __del__(self):
#         print(self.name+"对象的生命周期结束，程序结束")
# a = cat("aaa")
# #a是一个全局变量
# print("此代码块正在执行")
# print("对象a仍在被使用")
# print("直到程序结束 a对象死亡")



# class cat:
#     def __init__(self,new_name):
#         self.name = new_name
#         print(self.name+"对象的生命周期开始")
#     def __del__(self):
#         print(self.name+"对象a的生命周期结束，程序结束")
# a = cat("aaa")
# #a是一个全局变量
# #del可以删除一个对象
# print("代码运行至此处")
# del a
# # 删除对象a
# print("代码运行至此处")


#del 删除对象的生命周期 在结束之前对对象内置方法del进行自动调用


"""
__str__方法
str方法必须返回一个字符串
"""
# class cat:
#     def __init__(self,name):
#         self.name = name
#         print(self.name+" init")
#     def __del__(self):
#         print(self.name+" del")
#     def __str__(self):
#         return "aaaaaaaa "+self.name#返回一个字符串
# red_cat = cat("aaa")
# print(red_cat.name)
# print(red_cat)#在使用str方法时 这里不再输出地址而是返回的字符串












